package net.club.services;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import net.club.daos.AbstractDao;
import net.club.daos.IActividadDao;
import net.club.daos.IActividadFijaDao;
import net.club.daos.IEstadoActividadDao;
import net.club.daos.IEstadoUsuarioDao;
import net.club.daos.ISubsistemaContableDao;
import net.club.daos.ITipoDocumentoDao;
import net.club.daos.IUsuarioDao;
import net.club.daos.impl.ActividadDaoImpl;
import net.club.daos.impl.ActividadFijaDaoImpl;
import net.club.daos.impl.EstadoActividadDaoImpl;
import net.club.daos.impl.EstadoUsuarioDaoImpl;
import net.club.daos.impl.SubsistemaContableDaoImpl;
import net.club.daos.impl.TipoDocumentoDaoImpl;
import net.club.daos.impl.UsuarioDaoImpl;
import net.club.services.constants.ICONSTANTES_ERRORS;
import beans.club.services.AbstractBeanInput;
import beans.club.services.AbstractBeanOutput;
import beans.club.services.usuario.ABMCUsuarioOutput;


public abstract class AbstractService extends AbstractDao
    implements Serializable {
    protected IUsuarioDao daoUsuario = new UsuarioDaoImpl();
    protected IActividadFijaDao daoActividadFija = new ActividadFijaDaoImpl();
    protected IEstadoUsuarioDao daoEstadoUsuario = new EstadoUsuarioDaoImpl();
    protected IEstadoActividadDao daoEstadoActividad = new EstadoActividadDaoImpl();
    protected ITipoDocumentoDao daoTipoDocumento = new TipoDocumentoDaoImpl();
    protected IActividadDao daoActividad = new ActividadDaoImpl();
    protected ISubsistemaContableDao daoSubsistemaContable = new SubsistemaContableDaoImpl();

    public AbstractBeanOutput doProcess(AbstractBeanInput input) {
        List<String> errores = new ArrayList<String>();
        ABMCUsuarioOutput output = new ABMCUsuarioOutput();

        if (!validateBean(input, errores)) {
            output.setErrores(errores);
            output.setResponse(false);
        }

        if (input.getCodigoOperacion().equals("A")) {
            output = (ABMCUsuarioOutput) alta(input, errores);
        } else if (input.getCodigoOperacion().equals("B")) {
            output = (ABMCUsuarioOutput) baja(input, errores);
        } else if (input.getCodigoOperacion().equals("M")) {
            output = (ABMCUsuarioOutput) modificacion(input, errores);
        } else if (input.getCodigoOperacion().equals("C")) {
            output = (ABMCUsuarioOutput) consulta(input, errores);
        }

        return output;
    }

    public Integer getIDEntidad(String uri) {
        return new Integer(uri);
    }

    protected Object getEntity(String uriEntidad, Class clazz) {
        return super.find(clazz, getIDEntidad(uriEntidad));
    }

    protected AbstractBeanOutput consulta(AbstractBeanInput input,
        List<String> errores) {
        // TODO Auto-generated method stub
        return null;
    }

    protected AbstractBeanOutput modificacion(AbstractBeanInput input,
        List<String> errores) {
        // TODO Auto-generated method stub
        return null;
    }

    protected AbstractBeanOutput baja(AbstractBeanInput input,
        List<String> errores) {
        // TODO Auto-generated method stub
        return null;
    }

    protected AbstractBeanOutput alta(AbstractBeanInput input,
        List<String> errores) {
        // TODO Auto-generated method stub
        return null;
    }

    public boolean validateBean(AbstractBeanInput input, List<String> errores) {
        boolean result = true;

        if (input == null) {
            errores.add(ICONSTANTES_ERRORS.BEAN_NULO);

            return false;
        }

        if (input.getCodigoOperacion() == null) {
            errores.add(ICONSTANTES_ERRORS.OPERACION_NULO);

            return false;
        }

        if (!getOperaciones().contains(input.getCodigoOperacion())) {
            errores.add(ICONSTANTES_ERRORS.OPERACION_INVALIDA);

            return false;
        }

        return result;
    }

    public List<String> getOperaciones() {
        List<String> operaciones = new ArrayList<String>();
        operaciones.add("A");
        operaciones.add("B");
        operaciones.add("M");
        operaciones.add("C");

        return operaciones;
    }

    public IActividadFijaDao getDaoActividadFija() {
        return daoActividadFija;
    }

    public void setDaoActividadFija(IActividadFijaDao daoActividadFija) {
        this.daoActividadFija = daoActividadFija;
    }

    public IEstadoUsuarioDao getDaoEstadoUsuario() {
        return daoEstadoUsuario;
    }

    public void setDaoEstadoUsuario(IEstadoUsuarioDao daoEstadoUsuario) {
        this.daoEstadoUsuario = daoEstadoUsuario;
    }

    public ITipoDocumentoDao getDaoTipoDocumento() {
        return daoTipoDocumento;
    }

    public void setDaoTipoDocumento(ITipoDocumentoDao daoTipoDocumento) {
        this.daoTipoDocumento = daoTipoDocumento;
    }

    public IUsuarioDao getDaoUsuario() {
        return daoUsuario;
    }

    public void setDaoUsuario(IUsuarioDao daoUsuario) {
        this.daoUsuario = daoUsuario;
    }
}
